package org.lilystudio.veryftp.dao;

import java.util.*;
import java.io.*;

/**
 * 在http://www.hibernate.org/328.html看到的模式，就拷下来试用下
 * 这是一个对所有数据操作进行抽象对接口，注释为Marshall添加
 * 
 * @author www.hibernate.org
 * @copyright www.hibernate.org
 */
public interface GenericDAO<T, ID extends Serializable> {

	/**
	 * 通过ID取得数据对象，ID通常为Integer
	 * 
	 * @param id
	 *            数据的唯一标识
	 * @return 查询的结果对象
	 */
	T findById(ID id);

	/**
	 * 查找所有的对象
	 * 
	 * @return List<T>
	 */
	List<T> findAll();

	/**
	 * 根据示例对象查找对象集合
	 * 
	 * @param exampleInstance
	 *            示例对象
	 * @return List<T> 结果集合
	 */
	List<T> findByExample(T exampleInstance);

	/**
	 * 把该对象存入数据库，可能为修改，也可能为添加
	 * 
	 * @param entity
	 *            要持久化的对象
	 * @return T 已经持久化过的对象
	 */
	void save(T entity);
	
	/**
	 * 
	 * @param entity
	 */
	void merge(T entity);

	/**
	 * 把该对象从数据库中删除
	 * 
	 * @param entity
	 *            需要删除的对象
	 */
	void delete(T entity);

	/**
	 * @param namedQuery
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<T> findByNamedQuery(final String namedQuery);

	/**
	 * @param query
	 * @param parameter
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<T> findByNamedQuery(final String query, final Object parameter);

	/**
	 * @param query
	 * @param parameters
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<T> findByNamedQuery(final String query,
			final Object[] parameters);

	/**
	 * @param query
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<T> find(final String query);

	/**
	 * @param query
	 * @param parameter
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<T> find(final String query, final Object parameter);

}
